package cn.tedu.sp06.filter;

import cn.tedu.web.util.JsonResult;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.apache.commons.lang.StringUtils;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

/**
 * 模拟判断是否登录
 * http://localhost:3001/item-service/33axda    没有登录，不允许访问
 * 已登录可以访问：
 * http://localhost:3001/item-service/33axda?token=8sjq
 * 只检查对商品访问的权限
 * 用户和订单的访问不检查权限
 */
@Component
public class LoginFilter extends ZuulFilter {
    @Override
    public String filterType() {//设置过滤器的类型(pre,routing,post)自定义的放在pre
//      前置过滤器，一般自定义过滤器都使用前置过滤器
//        return "pre";与下面的写法效果相同
        return FilterConstants.PRE_TYPE;
    }

    @Override
    public int filterOrder() {//设置过滤器的顺序号
//        第5个过滤器中添加了serviceId
//      后面过滤器才能使用
        return 6;
    }

    @Override
    public boolean shouldFilter() {//判断针对当前请求是否执行过滤代码
//      此处设定为： 调用商品检查权限，调用用户和订单不检查权限
//        判断当前请求是否为item-service
//        1.获得一个请求上下文对象
        RequestContext ctx = RequestContext.getCurrentContext();
//        2.从上下文对象获取调用的服务id
      String serviceId = (String) ctx.get(FilterConstants.SERVICE_ID_KEY);//括号里也就是"serviceId"
//        3.判断服务id是否为item-service
        return "item-service".equals(serviceId);
    }

    @Override
    public Object run() throws ZuulException {//过滤代码
//        1.获得上下文对象
        RequestContext ctx = RequestContext.getCurrentContext();
//        2.获得request对象
        HttpServletRequest request = ctx.getRequest();
//        3.接收token参数
        String token = request.getParameter("token");
//        4.如果没有token,阻止继续调用,直接返回响应
        if(StringUtils.isBlank(token)){//判断token是否为null，"","   "
            ctx.setSendZuulResponse(false);//阻止调用
//            直接返回响应   JsonResult -->{code:400,msg:Not Login,data:null}
            String json = JsonResult.err().code(JsonResult.NOT_LOGIN)
                    .msg("Not Login!哈哈")
                    .toString();
            ctx.addZuulResponseHeader("Content-type",
                    "application/json;charset=UTF-8");
            ctx.setResponseBody(json);

        }
//        在当前zuul版本中，这个返回值没有任何作用
        return null;
    }
}
